package negocio;

import datos.TipoConstruccion;
import java.net.URL;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 *
 * @author Ing. Monica Merlo, Ing. Agustin  Fernandez
 */
@Stateless
public class GestorTipoConstruccionBean implements GestorTipoConstruccionRemote, GestorTipoConstruccionLocal {

    static Logger logger = Logger.getLogger(GestorTipoConstruccionBean.class);

    public static void log4j(Exception e) {
        URL url = GestorTipoConstruccionBean.class.getResource("/configuracion/log4j.properties");
        PropertyConfigurator.configure(url);
        logger.error(e);
    }
    @PersistenceContext
    private EntityManager em;

    /***
     *
     * @param object
     */
    public void persist(Object object) {
        em.persist(object);
    }

    /***
     * Retorna todas las instancias de TipoConstruccion
     * @return lista con todos las instancias de Tipo de Construccion 
     * almacenadas en la base de datos, y null en caso contrario
     * interfaz local
     */
    public List consultarTipoConstruccion() {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoConstruccion.findAll");
            return q.getResultList();

        } catch (Exception e) {
            GestorTipoConstruccionBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna todas las instancias de TipoConstruccion
     * @return lista con todos las instancias de Tipo de Construccion
     * almacenadas en la base de datos, y null en caso contrario
     * interfaz remota
     */
    public List consultarTipoConstruccionRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoConstruccion.findAll");
            return q.getResultList();

        } catch (Exception e) {
            GestorTipoConstruccionBean.log4j(e);
            return null;
        }
    }

    /***
     * retorna una lista sólo con los nombres de las instancias de TipoConstruccion ordenados.
     * @return lista con todos los nombres de las instancias de TipoConstruccion ordenados por nombre
     * y null en caso contrario
     * interfaz local
     */
    public List tiposConstruccion() {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoConstruccion.encontrarTodosNombre");
            return q.getResultList();

        } catch (Exception e) {
            GestorTipoConstruccionBean.log4j(e);
            return null;
        }

    }

    /***
     * retorna una lista sólo con los nombres de las instancias de TipoConstruccion ordenados.
     * @return lista con todos los nombres de las instancias de TipoConstruccion ordenados por nombre
     * y null en caso contrario
     * interfaz remota
     */
    public List tiposConstruccionRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoConstruccion.encontrarTodosNombre");
            return q.getResultList();

        } catch (Exception e) {
            GestorTipoConstruccionBean.log4j(e);
            return null;
        }

    }

    /***
     * Agrega una nueva instancia de TipoConstruccion a la BD.
     * @param tipoConstruccion
     * @return true si la instancia tipoConstruccion ha sido persistida
     * con exito y false en caso contrario
     * interfaz local
     */
    public boolean agregarTipoConstruccion(TipoConstruccion tipoConstruccion) {
        try {
            persist(tipoConstruccion);
            return true;
        } catch (Exception e) {
            GestorTipoConstruccionBean.log4j(e);
            return false;
        }
    }

    /***
     * Agrega una nueva instancia de TipoConstruccion a la BD.
     * @param tipoConstruccion
     * @return true si la instancia tipoConstruccion ha sido persistida
     * con exito y false en caso contrario
     * interfaz remota
     */
    public boolean agregarTipoConstruccionRemote(TipoConstruccion tipoConstruccion) {
        try {
            persist(tipoConstruccion);
            return true;
        } catch (Exception e) {
            GestorTipoConstruccionBean.log4j(e);
            return false;
        }

    }

    /***
     * Actualiza una instancia existente en la BD de tipo TipoConstruccion.
     * @param tipoConstruccion
     * @return true si la instancia tipoConstruccion ha sido modificada y actualizada
     * en la base de datos con exito y false en caso contrario
     * interfaz local
     */
    public boolean modificarTipoConstruccion(TipoConstruccion tipoConstruccion) {
        try {
            TipoConstruccion tc = em.find(TipoConstruccion.class, tipoConstruccion.getId());
            tc.setDescripcion(tipoConstruccion.getDescripcion().toUpperCase());
            tc.setNombre(tipoConstruccion.getNombre().toUpperCase());
            persist(tc);
            return true;
        } catch (Exception e) {
            GestorTipoConstruccionBean.log4j(e);
            return false;
        }
    }

    /***
     * Actualiza una instancia existente en la BD de tipo TipoConstruccion.
     * @param tipoConstruccion
     * @return true si la instancia tipoConstruccion ha sido modificada y actualizada
     * en la base de datos con exito y false en caso contrario
     * interfaz remota
     */
    public boolean modificarTipoConstruccionRemote(TipoConstruccion tipoConstruccion) {
        try {
            TipoConstruccion to = em.find(TipoConstruccion.class, tipoConstruccion.getId());
            to.setDescripcion(tipoConstruccion.getDescripcion().toUpperCase());
            to.setNombre(tipoConstruccion.getNombre().toUpperCase());
            persist(to);
            return true;
        } catch (Exception e) {
            GestorTipoConstruccionBean.log4j(e);
            return false;
        }
    }

    /***
     * Busca una instancia de TipoConstruccion, a partir de su ID y una vez encontrada
     * es removida de la BD.
     * @param tipoConstruccion
     * @return true si la instancia tipoConstruccion ha sido encontrada y eliminada
     * de la base de datos con exito y false en caso contrario
     * interfaz local
     */
    public boolean eliminarTipoConstruccion(TipoConstruccion tipoConstruccion) {
        try {
            TipoConstruccion to = em.find(TipoConstruccion.class, tipoConstruccion.getId());
            em.remove(to);
            return true;
        } catch (Exception e) {
            GestorTipoConstruccionBean.log4j(e);
            return false;
        }
    }

    /***
     * Busca una instancia de TipoConstruccion, a partir de su ID y una vez encontrada
     * es removida de la BD.
     * @param tipoConstruccion
     * @return true si la instancia tipoConstruccion ha sido encontrada y eliminada
     * de la base de datos con exito y false en caso contrario
     * interfaz remota
     */
    public boolean eliminarTipoConstruccionRemote(TipoConstruccion tipoConstruccion) {
        try {
            TipoConstruccion tc = em.find(TipoConstruccion.class, tipoConstruccion.getId());
            em.remove(tc);
            return true;
        } catch (Exception e) {
            GestorTipoConstruccionBean.log4j(e);
            return false;
        }
    }

    /***
     * Busca una instancia TipoConstruccion en la BD, si es encontrada retorna true,
     * en caso contrario false.
     * @param tipoConstruccion
     * @return true si existe alguna instancia tipoConstruccion con nombre igual a "nombre"
     * y false en caso contrario
     * interfaz local
     */
    public boolean existeNombreTipoConstruccion(TipoConstruccion tipoConstruccion) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoConstruccion.findByNombre");
            q.setParameter("nombre", tipoConstruccion.getNombre().toUpperCase());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorTipoConstruccionBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorTipoConstruccionBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorTipoConstruccionBean.log4j(ie);
            return true;
        }

    }

    /***
     * Busca una instancia TipoConstruccion en la BD, si es encontrada retorna true,
     * en caso contrario false.
     * @param tipoConstruccion
     * @return true si existe alguna instancia tipoConstruccion con nombre igual a "nombre"
     * y false en caso contrario
     * interfaz remota
     */
    public boolean existeNombreTipoConstruccionRemote(TipoConstruccion tipoConstruccion) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoConstruccion.findByNombre");
            q.setParameter("nombre", tipoConstruccion.getNombre().toUpperCase());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorTipoConstruccionBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorTipoConstruccionBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorTipoConstruccionBean.log4j(ie);
            return true;
        }

    }

    /***
     * Busca si existe en la BD el nombre de una instancia de TipoConstruccion, para no
     * almacenar dos instancias distintas con el mismo nombre. si existe retorna true,
     * en caso contrario retorna false.
     * @param tipoConstruccion
     * @return true si existe alguna instancia de TipoConstruccion con nombre = "nombre" e id <> "id"
     * y false en caso contrario
     * interfaz local
     */
    public boolean existeNombreTipoConstruccionModificar(TipoConstruccion tipoConstruccion) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoConstruccion.findByNombreModificar");
            q.setParameter("nombre", tipoConstruccion.getNombre().toUpperCase());
            q.setParameter("id", tipoConstruccion.getId());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorTipoConstruccionBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorTipoConstruccionBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorTipoConstruccionBean.log4j(ie);
            return true;
        }
    }

    /***
     * Busca si existe en la BD el nombre de una instancia de TipoConstruccion, para no
     * almacenar dos instancias distintas con el mismo nombre. si existe retorna true,
     * en caso contrario retorna false.
     * @param tipoConstruccion
     * @return true si existe alguna instancia de TipoConstruccion con nombre = "nombre" e id <> "id"
     * y false en caso contrario
     * interfaz remota
     */
    public boolean existeNombreTipoConstruccionModificarRemote(TipoConstruccion tipoConstruccion) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoConstruccion.findByNombreModificar");
            q.setParameter("nombre", tipoConstruccion.getNombre().toUpperCase());
            q.setParameter("id", tipoConstruccion.getId());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorTipoConstruccionBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorTipoConstruccionBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorTipoConstruccionBean.log4j(ie);
            return true;
        }

    }
}
